Isotope Dendrochronology
Mechanistic model of the Oxygen isotopes in cellulose.
COURSE: DISC, LTRR, UNIVERSITY OF ARIZONA. INSTRUCTORS: P. SZEJNER & S. BELMECHERI
Instructions:
The following code and comments should further your experience of using tree ring and Oxygen isotopes in cellulose using R. This exercise relies upon estimations and measurements of the different factors that determine the oxygen isotopes in the cellulose that we can date in tree rings. The following calculations will be relying on the use of the Craig Gordon model, and the Roden model.
Craig H, Gordon L (1965) Deuterium and oxygen 18 variations in the ocean and the marine atmosphere. In: Tongiorgi E (ed) Stable Isotopes in Oceanographic Studies and Paleotemperatures. Consiglio Nazionale delle ricerche Laboratorio di Geologia Nucleare. Pisa, Spoleto, Italy, pp 9–130).
Roden J, Lin G, Ehleringer JR (2000) A mechanistic model for interpretation of hydrogen and oxygen isotope ratios in tree-ring cellulose. Geochim Cosmochim Acta 64:21–35. https://doi.org/10.1016/S0016-7037(99)00195-7
When it comes to stable Oxygen isotopes in cellulose (δ18Ocell), three dominant factors will contribute to how the δ18Ocell is recorded in tree rings. These three factors are;
1. The isotopic content of the source water.
2. The leaf evaporative enrichment effect.
3. The proportion of phloem sugars that exchange with source water during cellulose formation.
The signal of these three processes is integrated into the cambium during xylogenesis.
The source of Oxygen in plants is coming from the water. In the following exercise, we will implement a mechanistic model in which we will follow the isotopic fractionation processes in which the isotopic ratios from the main molecules involved in cellulose formation are modified and fixed. And how this can be useful in tree-ring research.
In this exercise, you will model three different isotopic ratios in cellulose for different environmental conditions. First, we will model the δ18Ocell from one environment with a sharp seasonal change like in the Southwestern US with a cool spring with moisture availability from the snowpack, followed by a pre-summer drought period, ending with a humid monsoon season during summer. Therefore, the relative humidity can progress from 50% (spring) to 30% (pre-summer drought) to 60%(monsoon) along these three seasonal periods, the temperatures will vary from 25, to 33, to 27 Celsius and the isotopic source water will, in this excesrise, remain constant at -8 permill. At the end of the excersise, you will compare these three results with real measurements in tree rings form the South West where the trees are exposed to these kind of variations in relative humidity.
Instructions on geting the R project going
You will need to download the R project from https://github.com/paulszejner/DISCO-Notebook2.git and set your own working directory. Once you open the Notebook2.Rproj in R studio you can open the Notebook2.Rmd file to proceed with this exercise.
PART 1: Oxygen isotopes from the source water.
In this document, the “source water” noted as Source_18O will be the isotopic ratio that the plant transport through the xylem up to the leaves. Thus, it is the starting point in which the isotopic effects will be recorded during all the steps. Hence, the importance of having a good estimation or measurement of it.
#the isotopic values in diferent notations
Source_18O <- -8 # This is the isotopic value of the source water and will remain constant at -8 permill during this excersise
rsmow <- 0.0020052 # Oxygen Isotope ratio from STANDARD SMOV
Rsource= rsmow*(1+Source_18O/1000) # conversion to the Ratio with no standardization.
# Estimation of the isotopic value of the water vapor asuming equilibrium between atmospheric vapor and source water! remember to modify these values to the variability form the text above
###########
temperature <- c(40, 40, 40) # temp in celsius youo will need to modify
###########
#summary of what is below! water_vapor = Source+(isotopic effect from the fase change under equilibrium and have to convert the temperature in Kalvin (273.15),... so we are on top of what is going on)
water_vapor <-Source_18O +(-1*(1.137*(1000000/((temperature+273.15)^2))-0.4156*((1000/(temperature+273.15))-2.0667)))
#R atm Oxy isotope ratio, atmosph water vapor
Rwater_vapor= rsmow*(1+water_vapor/1000)
#note! I need help on figuring out this!
PART 2: leaf water isotopic enrichment
Now that we have our source water and estimate the water vapor, then we can focus on what will happen to this water at the leaf during transpiration.
The leaf water isotopic enrichment can be estimated using the Craig Gordon model of leaf water enrichment because the water inside the leaf is exposed to evaporation. The isotopic values of the reminding water inside the leaf will have a different isotopic value from the source Rsource < leaf_water_18O . This process will depend on relative humidity, and we can apply the Craig Gordon model to estimate the isotopic values at the leaf level under certain relative humidity temperatures and stomatal conductance.
#Constants
# br = boundary layer conductance. (mol m-2 s-1)
br <-1 #considered reasonable value between 0.02 to 3 in Roden paper boundary layer resistance
ak <- 1.0285 # alpha_kappa, Kinetic Fractionation
akb <- 1.0189 # alpha_kappa_beta, Kinetic Fractionation boundary layer
# Variables remember to modify these values to the variability form the Figure 1
###########
Relative_humidity <- c(100, 100, 100)
###########
Stomatal_conductance <- 0.5
We already know that the source water has this values:
round (Rsource, digits = 4)
We already know that the water vapor could be close to has this values:
round(Rwater_vapor, digits = 4)
# a* **equilibrium fractionation at leaf temperature
# The equilibrium fractionation factor, a* is temperature dependent
# (see Majoube, 1971, J. Chim. Phys. 58:1423-1436)
alpha_star =exp((1.137*1000/(273.15+temperature)^2)-(0.4156/(273.15+temperature))-0.0020667)
#R source O isotope ratio, source water
# barometric pressure (mmbar)
press_bar <- 77 #a good site average is 77.5 according to W, This need to be changed for the pressure level
Here we assume that the vapor is saturated inside the leaf. We apply this formula to calculate the vapor pressure when saturated (Rh=100%) at the temperature we best estimate the plant is and call it "ei".
ei <- (101325*exp((((-0.1299*(1-(373.16/(273.15 + temperature)))-0.6445)*(1-(373.16/(273.15 + temperature)))-1.976)*(1-(373.16/(273.15 + temperature)))+13.3185)*(1-(373.16/(273.15 + temperature)))))/1000
#wi, leaf water vapor, converted to mole fraction
wi=ei/press_bar
#ea ambient vapor pressure (kPa)
ea_v <- (Relative_humidity/100)*ei
#wa, ambient water vapor, mole fraction
wa_v= ea_v/press_bar
# VPD in (kPa)
vpd =ei-ea_v
round(vpd, digits=4 )
Here we can see the differences in Vapour presure defficity along these three times during the growing season.
#Total Conductance in mol
g = 1/(1/Stomatal_conductance + 1/br) # or 1/(rs+rb)
# E leaf transpiration (mol m-2 s-1) # barbour 2004
E_v_gs <- (wi-wa_v)*g
#ws, leaf surface water vapor, mole frac Roden 2000, Ball (1987),
ws_v_gs <- ((Stomatal_conductance*wi)-E_v_gs*(1-wi/2))/(Stomatal_conductance - E_v_gs/2)
# es vapor pressure at leaf surface (kPa) higher pressure than the atmosphere
esl_v_gs <- ws_v_gs*press_bar
round(esl_v_gs, digits = 2)
round(ea_v, digits=2)
Lets recall some values that we already have estimated that will be important to keep track and estimate the expectation on the leaf water enrichment:
Rsource Source water
Rwater_vapor isotopic value of the water vapor
ei Water vapor presure saturated inside the leaf
ea_v Water vapor pressure atmosphere
esl_v_gs Water vapor pressure at leaf surface
And some constants like alpha_kappa, Kinetic Fractionation and alpha_kappa_beta, Kinetic Fractionation boundary layer
ak <- 1.0285 # alpha_kappa, Kinetic Fractionation
akb <- 1.0189 # alpha_kappa_beta, Kinetic Fractionation boundary layer
# here we estimate the Leaf water enrichment:
Rleaf_v <- alpha_star*((ak*Rsource *
((ei-esl_v_gs)/ei))+
(akb*Rsource *(esl_v_gs-ea_v)/ei)+
(Rwater_vapor*ea_v/ei))
# Rleaf_v now the leaf water is estimated in terms of R and we must convert this value on permill in rsmow Oxygen Isotope ratio from STANDARD SMOV
# Recall
rsmow <- 0.0020052
# we started on a value of -10 permil now after the evaporative enrichment the leaf water has moverd from -10 to 5 permil
leaf_water_18O <- ((Rleaf_v/rsmow)-1)*1000
round(leaf_water_18O, digits = 2)
PART 3: isotopic signal in the Cellulose
Isotopic fractionation during sugar synthesis and mixing during cellulose synthesis.
Now, after we know the water where the sugars are made and transported in the phloem, we can use the leaf water and the Source_18O to estimate the result on the cellulose, take into consideration that during cellulose synthesis, the source water will have some influence on the result, and we usually use a 42 percent exchange.
# Now after we know the water where the sugars are made and trasported in the floem we can use the leaf water and the Source_18O to estimate the end result on the cellulose, take in consideration that during cellulose sinthesisi the source water will have some influence on the end result. and we usualy use a 42 percent exchange
# and some constants
epsilon_s <- 27 #Autotrophic fractionation Sucrose
epsilon_c <- 27 # Autotrophic fractionation Cellulose ## 0.0084*Tmin.ts^2-0.51*Tmin.ts+ 33.172
F_0 <- 0.42 # proportion of source water used during cellulose sinthesys
cellulose_d18O= F_0*(Source_18O + epsilon_c) + (1 - F_0) * (leaf_water_18O+ epsilon_s)
PART 4: Comparison between modeled data and observations
your estimations for the callulose oxygen Isotopes are:
round(cellulose_d18O, digits = 2)
your estimations for the leaf water oxygen Isotopes are:
round(leaf_water_18O, digits = 2)
Comparison between modeled data and observations,
Now with these values that you comared write down your observations differences and similarities between the modeled data in this excersise and the measurements shown in the figure 2 above.
How do you think this tool is useful?
What are the constrains or difficulties on impleenting this model for reliable analysis?
Good luck!
LS0tCnRpdGxlOiAiT3h5Z2VuIElzb3RvcGVzIGluIGNlbGx1bG9zZSIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQojIyMjIyAgSXNvdG9wZSBEZW5kcm9jaHJvbm9sb2d5CiMjIyMjICBNZWNoYW5pc3RpYyBtb2RlbCBvZiB0aGUgT3h5Z2VuIGlzb3RvcGVzIGluIGNlbGx1bG9zZS4KIyMjIyMgIENPVVJTRTogRElTQywgTFRSUiwgVU5JVkVSU0lUWSBPRiBBUklaT05BLiBJTlNUUlVDVE9SUzogUC4gU1pFSk5FUiAmIFMuIEJFTE1FQ0hFUkkKCiMjIyBJbnN0cnVjdGlvbnM6CgpUaGUgZm9sbG93aW5nIGNvZGUgYW5kIGNvbW1lbnRzIHNob3VsZCBmdXJ0aGVyIHlvdXIgZXhwZXJpZW5jZSBvZiB1c2luZyB0cmVlIHJpbmcgYW5kIE94eWdlbiBpc290b3BlcyBpbiBjZWxsdWxvc2UgdXNpbmcgUi4gVGhpcyBleGVyY2lzZSByZWxpZXMgdXBvbiBlc3RpbWF0aW9ucyBhbmQgbWVhc3VyZW1lbnRzIG9mIHRoZSBkaWZmZXJlbnQgZmFjdG9ycyB0aGF0IGRldGVybWluZSB0aGUgb3h5Z2VuIGlzb3RvcGVzIGluIHRoZSBjZWxsdWxvc2UgdGhhdCB3ZSBjYW4gZGF0ZSBpbiB0cmVlIHJpbmdzLiBUaGUgZm9sbG93aW5nIGNhbGN1bGF0aW9ucyB3aWxsIGJlIHJlbHlpbmcgb24gdGhlIHVzZSBvZiAgdGhlIENyYWlnIEdvcmRvbiBtb2RlbCwgYW5kIHRoZSBSb2RlbiBtb2RlbC4KCgpDcmFpZyBILCBHb3Jkb24gTCAoMTk2NSkgRGV1dGVyaXVtIGFuZCBveHlnZW4gMTggdmFyaWF0aW9ucyBpbiB0aGUgb2NlYW4gYW5kIHRoZSBtYXJpbmUgYXRtb3NwaGVyZS4gSW46IFRvbmdpb3JnaSBFIChlZCkgU3RhYmxlIElzb3RvcGVzIGluIE9jZWFub2dyYXBoaWMgU3R1ZGllcyBhbmQgUGFsZW90ZW1wZXJhdHVyZXMuIENvbnNpZ2xpbyBOYXppb25hbGUgZGVsbGUgcmljZXJjaGUgTGFib3JhdG9yaW8gZGkgR2VvbG9naWEgTnVjbGVhcmUuIFBpc2EsIFNwb2xldG8sIEl0YWx5LCBwcCA54oCTMTMwKS4KCgpSb2RlbiBKLCBMaW4gRywgRWhsZXJpbmdlciBKUiAoMjAwMCkgQSBtZWNoYW5pc3RpYyBtb2RlbCBmb3IgaW50ZXJwcmV0YXRpb24gb2YgaHlkcm9nZW4gYW5kIG94eWdlbiBpc290b3BlIHJhdGlvcyBpbiB0cmVlLXJpbmcgY2VsbHVsb3NlLiBHZW9jaGltIENvc21vY2hpbSBBY3RhIDY0OjIx4oCTMzUuIGh0dHBzOi8vZG9pLm9yZy8xMC4xMDE2L1MwMDE2LTcwMzcoOTkpMDAxOTUtNwoKCldoZW4gaXQgY29tZXMgdG8gc3RhYmxlIE94eWdlbiBpc290b3BlcyBpbiBjZWxsdWxvc2UgKM60MThPY2VsbCksIHRocmVlIGRvbWluYW50IGZhY3RvcnMgd2lsbCBjb250cmlidXRlIHRvIGhvdyB0aGUgzrQxOE9jZWxsIGlzIHJlY29yZGVkIGluIHRyZWUgcmluZ3MuIFRoZXNlIHRocmVlIGZhY3RvcnMgYXJlOyAgCjEuIFRoZSBpc290b3BpYyBjb250ZW50IG9mIHRoZSBzb3VyY2Ugd2F0ZXIuICAKMi4gVGhlIGxlYWYgZXZhcG9yYXRpdmUgZW5yaWNobWVudCBlZmZlY3QuICAgCjMuIFRoZSBwcm9wb3J0aW9uIG9mIHBobG9lbSBzdWdhcnMgdGhhdCBleGNoYW5nZSB3aXRoIHNvdXJjZSB3YXRlciBkdXJpbmcgY2VsbHVsb3NlIGZvcm1hdGlvbi4gICAKClRoZSBzaWduYWwgb2YgdGhlc2UgdGhyZWUgcHJvY2Vzc2VzIGlzIGludGVncmF0ZWQgaW50byB0aGUgY2FtYml1bSBkdXJpbmcgeHlsb2dlbmVzaXMuCgpUaGUgc291cmNlIG9mIE94eWdlbiBpbiBwbGFudHMgaXMgY29taW5nIGZyb20gdGhlIHdhdGVyLiBJbiB0aGUgZm9sbG93aW5nIGV4ZXJjaXNlLCB3ZSB3aWxsIGltcGxlbWVudCBhIG1lY2hhbmlzdGljIG1vZGVsIGluIHdoaWNoIHdlIHdpbGwgZm9sbG93IHRoZSBpc290b3BpYyBmcmFjdGlvbmF0aW9uIHByb2Nlc3NlcyBpbiB3aGljaCB0aGUgaXNvdG9waWMgcmF0aW9zIGZyb20gdGhlIG1haW4gbW9sZWN1bGVzIGludm9sdmVkIGluIGNlbGx1bG9zZSBmb3JtYXRpb24gYXJlIG1vZGlmaWVkIGFuZCBmaXhlZC4gQW5kIGhvdyB0aGlzIGNhbiBiZSB1c2VmdWwgaW4gdHJlZS1yaW5nIHJlc2VhcmNoLiAKCkluIHRoaXMgZXhlcmNpc2UsIHlvdSB3aWxsIG1vZGVsIHRocmVlIGRpZmZlcmVudCBpc290b3BpYyByYXRpb3MgaW4gY2VsbHVsb3NlIGZvciBkaWZmZXJlbnQgZW52aXJvbm1lbnRhbCBjb25kaXRpb25zLiBGaXJzdCwgd2Ugd2lsbCBtb2RlbCB0aGUgzrQxOE9jZWxsIGZyb20gb25lIGVudmlyb25tZW50IHdpdGggYSBzaGFycCBzZWFzb25hbCBjaGFuZ2UgbGlrZSBpbiB0aGUgU291dGh3ZXN0ZXJuIFVTIHdpdGggYSBjb29sIHNwcmluZyB3aXRoIG1vaXN0dXJlIGF2YWlsYWJpbGl0eSBmcm9tIHRoZSBzbm93cGFjaywgZm9sbG93ZWQgYnkgYSBwcmUtc3VtbWVyIGRyb3VnaHQgcGVyaW9kLCAgZW5kaW5nIHdpdGggYSBodW1pZCBtb25zb29uIHNlYXNvbiBkdXJpbmcgc3VtbWVyLiAgVGhlcmVmb3JlLCB0aGUgcmVsYXRpdmUgaHVtaWRpdHkgY2FuIHByb2dyZXNzIGZyb20gNTAlIChzcHJpbmcpIHRvIDMwJSAocHJlLXN1bW1lciBkcm91Z2h0KSB0byA2MCUobW9uc29vbikgYWxvbmcgdGhlc2UgdGhyZWUgc2Vhc29uYWwgcGVyaW9kcywgdGhlIHRlbXBlcmF0dXJlcyB3aWxsIHZhcnkgZnJvbSAyNSwgdG8gMzMsIHRvIDI3IENlbHNpdXMgYW5kIHRoZSBpc290b3BpYyBzb3VyY2Ugd2F0ZXIgd2lsbCwgaW4gdGhpcyBleGNlc3Jpc2UsICByZW1haW4gY29uc3RhbnQgYXQgLTggcGVybWlsbC4gQXQgdGhlIGVuZCBvZiB0aGUgZXhjZXJzaXNlLCB5b3Ugd2lsbCBjb21wYXJlIHRoZXNlIHRocmVlIHJlc3VsdHMgd2l0aCByZWFsIG1lYXN1cmVtZW50cyBpbiB0cmVlIHJpbmdzIGZvcm0gdGhlIFNvdXRoIFdlc3Qgd2hlcmUgdGhlIHRyZWVzIGFyZSBleHBvc2VkIHRvIHRoZXNlIGtpbmQgb2YgdmFyaWF0aW9ucyBpbiByZWxhdGl2ZSBodW1pZGl0eS4KCiFbU2Vhc29uYWwgcmVsYXRpdmUgaHVtaWRpdHkgaW4gVHVjc29uIChCZWxtZWNoZXJpIGV0IGFsLiAyMDE4IFBDRSkuIE5vdGljZSB0aGUgbGFyZ2UgdmFyaWF0aW9ucyBvbiB0aGUgcmVsYXRpdmUgaHVtaWRpdHkgYW5kICB3ZSB3aWxsIHJ1biB0aGUgIGZvbGxvd2luZyBtb2RlbCB0byBwcmVkaWN0IHdoYXQgdG8gZXhwZWN0IGluIHRoZSBPeHlnZW4gSXNvdG9wZXMgaW4gdGhlIGNlbGx1bG9zZSBmb3JtZWQgYWxvbmcgdGhlc2Ugc2Vhc29uYWwgcHJvZ3Jlc2lvbl0oZmlndXJlcy9GSUdVUkUxX1JILnBuZykKCiMjIyMjIEluc3RydWN0aW9ucyBvbiBnZXRpbmcgdGhlIFIgcHJvamVjdCBnb2luZyAgCllvdSB3aWxsIG5lZWQgdG8gZG93bmxvYWQgdGhlIFIgcHJvamVjdCBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9wYXVsc3plam5lci9ESVNDTy1Ob3RlYm9vazIuZ2l0IGFuZCBzZXQgeW91ciBvd24gd29ya2luZyBkaXJlY3RvcnkuIE9uY2UgeW91IG9wZW4gdGhlIGBgYE5vdGVib29rMi5ScHJvamBgYCBpbiBSIHN0dWRpbyB5b3UgY2FuIG9wZW4gdGhlIGBgYE5vdGVib29rMi5SbWRgYGAgZmlsZSB0byBwcm9jZWVkIHdpdGggdGhpcyBleGVyY2lzZS4KCiMjIFBBUlQgMTogT3h5Z2VuIGlzb3RvcGVzIGZyb20gdGhlIHNvdXJjZSB3YXRlci4gCgpJbiB0aGlzIGRvY3VtZW50LCB0aGUgInNvdXJjZSB3YXRlciIgbm90ZWQgYXMgYGBgU291cmNlXzE4T2BgYCB3aWxsIGJlIHRoZSBpc290b3BpYyByYXRpbyB0aGF0IHRoZSBwbGFudCB0cmFuc3BvcnQgdGhyb3VnaCB0aGUgeHlsZW0gdXAgdG8gdGhlIGxlYXZlcy4gVGh1cywgaXQgaXMgdGhlIHN0YXJ0aW5nIHBvaW50IGluIHdoaWNoIHRoZSBpc290b3BpYyBlZmZlY3RzIHdpbGwgYmUgcmVjb3JkZWQgZHVyaW5nIGFsbCB0aGUgc3RlcHMuIEhlbmNlLCB0aGUgaW1wb3J0YW5jZSBvZiBoYXZpbmcgYSBnb29kIGVzdGltYXRpb24gb3IgbWVhc3VyZW1lbnQgb2YgaXQuCgpgYGB7cn0KCiN0aGUgaXNvdG9waWMgdmFsdWVzIGluIGRpZmVyZW50IG5vdGF0aW9ucwoKU291cmNlXzE4TyA8LSAtOCAjIFRoaXMgaXMgdGhlIGlzb3RvcGljIHZhbHVlIG9mIHRoZSBzb3VyY2Ugd2F0ZXIgYW5kICB3aWxsIHJlbWFpbiBjb25zdGFudCBhdCAtOCBwZXJtaWxsIGR1cmluZyB0aGlzICBleGNlcnNpc2UKcnNtb3cgPC0gMC4wMDIwMDUyICMgT3h5Z2VuIElzb3RvcGUgcmF0aW8gZnJvbSBTVEFOREFSRAlTTU9WClJzb3VyY2U9IHJzbW93KigxK1NvdXJjZV8xOE8vMTAwMCkgIyBjb252ZXJzaW9uIHRvIHRoZSBSYXRpbyB3aXRoIG5vIHN0YW5kYXJkaXphdGlvbi4KCiMgRXN0aW1hdGlvbiBvZiB0aGUgIGlzb3RvcGljIHZhbHVlIG9mIHRoZSB3YXRlciB2YXBvciBhc3VtaW5nICBlcXVpbGlicml1bSBiZXR3ZWVuIGF0bW9zcGhlcmljIHZhcG9yIGFuZCBzb3VyY2Ugd2F0ZXIhICAgcmVtZW1iZXIgdG8gbW9kaWZ5IHRoZXNlIHZhbHVlcyB0byB0aGUgdmFyaWFiaWxpdHkgZm9ybSB0aGUgdGV4dCBhYm92ZQoKIyMjIyMjIyMjIyMKdGVtcGVyYXR1cmUgPC0gYyg0MCwgNDAsIDQwKSAjIHRlbXAgaW4gY2Vsc2l1cyB5b3VvIHdpbGwgbmVlZCB0byBtb2RpZnkKIyMjIyMjIyMjIyMKCiNzdW1tYXJ5IG9mIHdoYXQgaXMgYmVsb3chIHdhdGVyX3ZhcG9yID0gU291cmNlKyhpc290b3BpYyBlZmZlY3QgZnJvbSB0aGUgZmFzZSBjaGFuZ2UgdW5kZXIgZXF1aWxpYnJpdW0gYW5kIGhhdmUgdG8gY29udmVydCB0aGUgdGVtcGVyYXR1cmUgaW4gS2FsdmluICgyNzMuMTUpLC4uLiBzbyB3ZSBhcmUgb24gdG9wIG9mIHdoYXQgaXMgZ29pbmcgb24pCndhdGVyX3ZhcG9yIDwtU291cmNlXzE4TyArKC0xKigxLjEzNyooMTAwMDAwMC8oKHRlbXBlcmF0dXJlKzI3My4xNSleMikpLTAuNDE1NiooKDEwMDAvKHRlbXBlcmF0dXJlKzI3My4xNSkpLTIuMDY2NykpKSAKCiNSIGF0bSAgT3h5ICBpc290b3BlIHJhdGlvLCBhdG1vc3BoICB3YXRlciB2YXBvcgpSd2F0ZXJfdmFwb3I9IHJzbW93KigxK3dhdGVyX3ZhcG9yLzEwMDApCiNub3RlISAgSSBuZWVkIGhlbHAgb24gZmlndXJpbmcgb3V0IHRoaXMhCmBgYAoKIyMgUEFSVCAyOiBsZWFmIHdhdGVyIGlzb3RvcGljIGVucmljaG1lbnQgIAoKTm93IHRoYXQgd2UgaGF2ZSBvdXIgc291cmNlIHdhdGVyIGFuZCBlc3RpbWF0ZSB0aGUgd2F0ZXIgdmFwb3IsIHRoZW4gd2UgY2FuIGZvY3VzIG9uIHdoYXQgd2lsbCBoYXBwZW4gdG8gdGhpcyB3YXRlciBhdCB0aGUgbGVhZiBkdXJpbmcgdHJhbnNwaXJhdGlvbi4gIAoKVGhlIGxlYWYgd2F0ZXIgaXNvdG9waWMgZW5yaWNobWVudCBjYW4gYmUgZXN0aW1hdGVkIHVzaW5nIHRoZSBDcmFpZyBHb3Jkb24gbW9kZWwgb2YgbGVhZiB3YXRlciBlbnJpY2htZW50IGJlY2F1c2UgdGhlIHdhdGVyIGluc2lkZSB0aGUgbGVhZiBpcyBleHBvc2VkIHRvIGV2YXBvcmF0aW9uLiBUaGUgaXNvdG9waWMgdmFsdWVzIG9mIHRoZSByZW1pbmRpbmcgd2F0ZXIgaW5zaWRlIHRoZSBsZWFmIHdpbGwgaGF2ZSBhIGRpZmZlcmVudCBpc290b3BpYyB2YWx1ZSBmcm9tIHRoZSBzb3VyY2UgYGBgUnNvdXJjZSA8IGxlYWZfd2F0ZXJfMThPYGBgICAuIFRoaXMgcHJvY2VzcyB3aWxsIGRlcGVuZCBvbiByZWxhdGl2ZSBodW1pZGl0eSwgYW5kIHdlIGNhbiBhcHBseSB0aGUgQ3JhaWcgR29yZG9uIG1vZGVsIHRvIGVzdGltYXRlIHRoZSBpc290b3BpYyB2YWx1ZXMgYXQgdGhlIGxlYWYgbGV2ZWwgdW5kZXIgY2VydGFpbiByZWxhdGl2ZSBodW1pZGl0eSB0ZW1wZXJhdHVyZXMgYW5kIHN0b21hdGFsIGNvbmR1Y3RhbmNlLiAKCmBgYHtyfQojQ29uc3RhbnRzCgojIGJyID0gYm91bmRhcnkgbGF5ZXIgY29uZHVjdGFuY2UuIChtb2wgbS0yIHMtMSkKYnIgPC0xICNjb25zaWRlcmVkIHJlYXNvbmFibGUgdmFsdWUgYmV0d2VlbiAwLjAyIHRvIDMgaW4gUm9kZW4gcGFwZXIgYm91bmRhcnkgbGF5ZXIgcmVzaXN0YW5jZSAgICAKYWsgPC0gMS4wMjg1CSMgYWxwaGFfa2FwcGEsIEtpbmV0aWMgRnJhY3Rpb25hdGlvbiAKYWtiIDwtIDEuMDE4OQkjIGFscGhhX2thcHBhX2JldGEsIEtpbmV0aWMgRnJhY3Rpb25hdGlvbiBib3VuZGFyeSBsYXllcgoKCiMgVmFyaWFibGVzICByZW1lbWJlciB0byBtb2RpZnkgdGhlc2UgdmFsdWVzIHRvIHRoZSB2YXJpYWJpbGl0eSBmb3JtIHRoZSBGaWd1cmUgMQoKIyMjIyMjIyMjIyMKUmVsYXRpdmVfaHVtaWRpdHkgPC0gYygxMDAsIDEwMCwgMTAwKQojIyMjIyMjIyMjIwoKU3RvbWF0YWxfY29uZHVjdGFuY2UgPC0gMC41CmBgYAoKV2UgYWxyZWFkeSBrbm93IHRoYXQgdGhlIHNvdXJjZSB3YXRlciBoYXMgdGhpcyB2YWx1ZXM6CmBgYCB7cn0Kcm91bmQgKFJzb3VyY2UsIGRpZ2l0cyA9IDQpCmBgYAoKV2UgYWxyZWFkeSBrbm93IHRoYXQgdGhlIHdhdGVyIHZhcG9yIGNvdWxkIGJlIGNsb3NlIHRvIGhhcyB0aGlzIHZhbHVlczoKYGBgIHtyfQpyb3VuZChSd2F0ZXJfdmFwb3IsIGRpZ2l0cyA9IDQpCmBgYCAKCmBgYHtyfQojIGEqICAqKmVxdWlsaWJyaXVtIGZyYWN0aW9uYXRpb24gYXQgbGVhZiB0ZW1wZXJhdHVyZSAgCiMgVGhlIGVxdWlsaWJyaXVtIGZyYWN0aW9uYXRpb24gZmFjdG9yLCBhKiBpcyB0ZW1wZXJhdHVyZSBkZXBlbmRlbnQgCiMgKHNlZSBNYWpvdWJlLCAxOTcxLCBKLiBDaGltLiBQaHlzLiA1ODoxNDIzLTE0MzYpCmFscGhhX3N0YXIgPWV4cCgoMS4xMzcqMTAwMC8oMjczLjE1K3RlbXBlcmF0dXJlKV4yKS0oMC40MTU2LygyNzMuMTUrdGVtcGVyYXR1cmUpKS0wLjAwMjA2NjcpCiNSIHNvdXJjZSBPICBpc290b3BlIHJhdGlvLCBzb3VyY2Ugd2F0ZXIKCgojIGJhcm9tZXRyaWMJcHJlc3N1cmUgIChtbWJhcikgIApwcmVzc19iYXIgPC0gNzcgI2EgZ29vZCBzaXRlIGF2ZXJhZ2UgaXMgNzcuNSBhY2NvcmRpbmcgdG8gVywgVGhpcyBuZWVkIHRvIGJlIGNoYW5nZWQgZm9yIHRoZSBwcmVzc3VyZSBsZXZlbApgYGAKCkhlcmUgd2UgYXNzdW1lIHRoYXQgdGhlIHZhcG9yIGlzIHNhdHVyYXRlZCBpbnNpZGUgdGhlIGxlYWYuIFdlIGFwcGx5IHRoaXMgZm9ybXVsYSB0byBjYWxjdWxhdGUgdGhlIHZhcG9yIHByZXNzdXJlIHdoZW4gc2F0dXJhdGVkIChSaD0xMDAlKSBhdCB0aGUgdGVtcGVyYXR1cmUgd2UgYmVzdCBlc3RpbWF0ZSB0aGUgcGxhbnQgaXMgYW5kIGNhbGwgaXQgYGBgImVpImBgYC4KCmBgYHtyfQoKZWkgPC0gKDEwMTMyNSpleHAoKCgoLTAuMTI5OSooMS0oMzczLjE2LygyNzMuMTUgKyB0ZW1wZXJhdHVyZSkpKS0wLjY0NDUpKigxLSgzNzMuMTYvKDI3My4xNSArIHRlbXBlcmF0dXJlKSkpLTEuOTc2KSooMS0oMzczLjE2LygyNzMuMTUgKyB0ZW1wZXJhdHVyZSkpKSsxMy4zMTg1KSooMS0oMzczLjE2LygyNzMuMTUgKyB0ZW1wZXJhdHVyZSkpKSkpLzEwMDAKCiN3aSwgIGxlYWYgd2F0ZXIgdmFwb3IsIGNvbnZlcnRlZCB0byBtb2xlIGZyYWN0aW9uCndpPWVpL3ByZXNzX2JhcgoKI2VhIGFtYmllbnQgdmFwb3IgcHJlc3N1cmUgKGtQYSkKZWFfdiA8LSAoUmVsYXRpdmVfaHVtaWRpdHkvMTAwKSplaQoKI3dhLCBhbWJpZW50IHdhdGVyIHZhcG9yLCBtb2xlIGZyYWN0aW9uCndhX3Y9IGVhX3YvcHJlc3NfYmFyCgojIFZQRCBpbiAoa1BhKQp2cGQgPWVpLWVhX3YgCnJvdW5kKHZwZCwgZGlnaXRzPTQgKQpgYGAKSGVyZSB3ZSBjYW4gc2VlIHRoZSBkaWZmZXJlbmNlcyBpbiBWYXBvdXIgcHJlc3VyZSBkZWZmaWNpdHkgYWxvbmcgdGhlc2UgdGhyZWUgdGltZXMgZHVyaW5nIHRoZSBncm93aW5nIHNlYXNvbi4KYGBgIHtyfQojVG90YWwgQ29uZHVjdGFuY2UgaW4gbW9sCmcgPSAxLygxL1N0b21hdGFsX2NvbmR1Y3RhbmNlICsgMS9icikgIyBvciAxLyhycytyYikKCiMgRSBsZWFmIHRyYW5zcGlyYXRpb24gKG1vbCBtLTIgcy0xKSAjIGJhcmJvdXIgMjAwNApFX3ZfZ3MgPC0gKHdpLXdhX3YpKmcKCiN3cywgbGVhZiBzdXJmYWNlIHdhdGVyIHZhcG9yLCBtb2xlIGZyYWMgUm9kZW4gMjAwMCwgQmFsbCAoMTk4NyksCndzX3ZfZ3MgPC0gKChTdG9tYXRhbF9jb25kdWN0YW5jZSp3aSktRV92X2dzKigxLXdpLzIpKS8oU3RvbWF0YWxfY29uZHVjdGFuY2UgLSBFX3ZfZ3MvMikKCiMgZXMgdmFwb3IgcHJlc3N1cmUgYXQgbGVhZiBzdXJmYWNlIChrUGEpIGhpZ2hlciBwcmVzc3VyZSAgdGhhbiB0aGUgYXRtb3NwaGVyZQplc2xfdl9ncyA8LSB3c192X2dzKnByZXNzX2JhcgoKcm91bmQoZXNsX3ZfZ3MsIGRpZ2l0cyA9IDIpCnJvdW5kKGVhX3YsIGRpZ2l0cz0yKQoKYGBgCgpMZXRzIHJlY2FsbCBzb21lICB2YWx1ZXMgIHRoYXQgd2UgYWxyZWFkeSBoYXZlIGVzdGltYXRlZCB0aGF0IHdpbGwgYmUgIGltcG9ydGFudCB0byBrZWVwIHRyYWNrIGFuZCBlc3RpbWF0ZSB0aGUgZXhwZWN0YXRpb24gb24gdGhlIGxlYWYgd2F0ZXIgZW5yaWNobWVudDoKCmBgYCBSc291cmNlIGBgYCAgU291cmNlIHdhdGVyICAKYGBgUndhdGVyX3ZhcG9yYGBgIGlzb3RvcGljIHZhbHVlIG9mIHRoZSB3YXRlciB2YXBvciAgICAgCmBgYGVpYGBgIFdhdGVyIHZhcG9yIHByZXN1cmUgc2F0dXJhdGVkIGluc2lkZSB0aGUgbGVhZiAgICAKYGBgZWFfdmBgYCAgV2F0ZXIgdmFwb3IgcHJlc3N1cmUgYXRtb3NwaGVyZSAgCmBgYGVzbF92X2dzYGBgIFdhdGVyIHZhcG9yIHByZXNzdXJlIGF0IGxlYWYgc3VyZmFjZSAgCgpBbmQgc29tZSBjb25zdGFudHMgIGxpa2UgYWxwaGFfa2FwcGEsIEtpbmV0aWMgRnJhY3Rpb25hdGlvbiAgYW5kIGFscGhhX2thcHBhX2JldGEsIEtpbmV0aWMgRnJhY3Rpb25hdGlvbiBib3VuZGFyeSBsYXllcgpgYGAge3J9CmFrIDwtIDEuMDI4NQkjIGFscGhhX2thcHBhLCBLaW5ldGljIEZyYWN0aW9uYXRpb24gCmFrYiA8LSAxLjAxODkJIyBhbHBoYV9rYXBwYV9iZXRhLCBLaW5ldGljIEZyYWN0aW9uYXRpb24gYm91bmRhcnkgbGF5ZXIKCiMgaGVyZSB3ZSBlc3RpbWF0ZSB0aGUgTGVhZiB3YXRlciBlbnJpY2htZW50OgpSbGVhZl92IDwtIGFscGhhX3N0YXIqKChhaypSc291cmNlICoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChlaS1lc2xfdl9ncykvZWkpKSsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYWtiKlJzb3VyY2UgKihlc2xfdl9ncy1lYV92KS9laSkrCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFJ3YXRlcl92YXBvciplYV92L2VpKSkKCiMgUmxlYWZfdiBub3cgdGhlIGxlYWYgd2F0ZXIgaXMgZXN0aW1hdGVkIGluIHRlcm1zIG9mIFIgIGFuZCB3ZSBtdXN0IGNvbnZlcnQgdGhpcyB2YWx1ZSAgb24gcGVybWlsbCBpbiByc21vdyBPeHlnZW4gSXNvdG9wZSByYXRpbyBmcm9tIFNUQU5EQVJECVNNT1YKIyBSZWNhbGwKcnNtb3cgPC0gMC4wMDIwMDUyCiMgd2Ugc3RhcnRlZCBvbiBhIHZhbHVlICBvZiAtMTAgcGVybWlsIG5vdyBhZnRlciAgdGhlIGV2YXBvcmF0aXZlIGVucmljaG1lbnQgIHRoZSBsZWFmIHdhdGVyIGhhcyBtb3ZlcmQgIGZyb20gLTEwIHRvIDUgcGVybWlsCmxlYWZfd2F0ZXJfMThPIDwtICgoUmxlYWZfdi9yc21vdyktMSkqMTAwMApyb3VuZChsZWFmX3dhdGVyXzE4TywgZGlnaXRzID0gMikKYGBgCgojIyBQQVJUIDM6IGlzb3RvcGljIHNpZ25hbCBpbiB0aGUgQ2VsbHVsb3NlICAKCklzb3RvcGljIGZyYWN0aW9uYXRpb24gZHVyaW5nIHN1Z2FyIHN5bnRoZXNpcyBhbmQgbWl4aW5nIGR1cmluZyBjZWxsdWxvc2Ugc3ludGhlc2lzLiAKCk5vdywgYWZ0ZXIgd2Uga25vdyB0aGUgd2F0ZXIgd2hlcmUgdGhlIHN1Z2FycyBhcmUgbWFkZSBhbmQgdHJhbnNwb3J0ZWQgaW4gdGhlIHBobG9lbSwgd2UgY2FuIHVzZSB0aGUgbGVhZiB3YXRlciBhbmQgdGhlIFNvdXJjZV8xOE8gdG8gZXN0aW1hdGUgdGhlIHJlc3VsdCBvbiB0aGUgY2VsbHVsb3NlLCB0YWtlIGludG8gY29uc2lkZXJhdGlvbiB0aGF0IGR1cmluZyBjZWxsdWxvc2Ugc3ludGhlc2lzLCB0aGUgc291cmNlIHdhdGVyIHdpbGwgaGF2ZSBzb21lIGluZmx1ZW5jZSBvbiB0aGUgcmVzdWx0LCBhbmQgd2UgdXN1YWxseSB1c2UgYSA0MiBwZXJjZW50IGV4Y2hhbmdlLgoKCmBgYHtyfQojIE5vdyAgIGFmdGVyIHdlIGtub3cgdGhlICB3YXRlciB3aGVyZSB0aGUgc3VnYXJzIGFyZSBtYWRlIGFuZCB0cmFzcG9ydGVkIGluIHRoZSBmbG9lbSAgd2UgY2FuIHVzZSB0aGUgbGVhZiB3YXRlciBhbmQgdGhlIFNvdXJjZV8xOE8gdG8gZXN0aW1hdGUgdGhlIGVuZCByZXN1bHQgb24gdGhlIGNlbGx1bG9zZSwgdGFrZSBpbiBjb25zaWRlcmF0aW9uIHRoYXQgZHVyaW5nICBjZWxsdWxvc2Ugc2ludGhlc2lzaSAgdGhlIHNvdXJjZSB3YXRlciB3aWxsIGhhdmUgc29tZSBpbmZsdWVuY2Ugb24gdGhlIGVuZCByZXN1bHQuIGFuZCB3ZSB1c3VhbHkgdXNlIGEgNDIgcGVyY2VudCBleGNoYW5nZQojIGFuZCBzb21lIGNvbnN0YW50cwoKZXBzaWxvbl9zIDwtICAyNyAjQXV0b3Ryb3BoaWMgZnJhY3Rpb25hdGlvbiBTdWNyb3NlCQplcHNpbG9uX2MgPC0gMjcJIyBBdXRvdHJvcGhpYyBmcmFjdGlvbmF0aW9uIENlbGx1bG9zZSAjIyAwLjAwODQqVG1pbi50c14yLTAuNTEqVG1pbi50cysgMzMuMTcyIApGXzAgPC0gMC40MiAjIHByb3BvcnRpb24gb2Ygc291cmNlIHdhdGVyIHVzZWQgZHVyaW5nIGNlbGx1bG9zZSBzaW50aGVzeXMKCmNlbGx1bG9zZV9kMThPPSBGXzAqKFNvdXJjZV8xOE8gKyBlcHNpbG9uX2MpICsgKDEgLSBGXzApICogKGxlYWZfd2F0ZXJfMThPKyBlcHNpbG9uX3MpIAoKYGBgCgojIyBQQVJUIDQ6IENvbXBhcmlzb24gYmV0d2VlbiBtb2RlbGVkIGRhdGEgYW5kIG9ic2VydmF0aW9ucwoKIVtNZWNoYW5pc3RpYyBtb2RlbGluZyBvZiB0cmVl4oCQcmluZyBjZWxsdWxvc2UgzrQxOE8gYW5kIGxlYWYgd2F0ZXIgZW5yaWNobWVudCDOlEwsIGFuZCB0aGVpciBzZW5zaXRpdml0aWVzIHRvIHJlbGF0aXZlIGh1bWlkaXR5LiAoYSkgVGhlIENyYWln4oCTR29yZG9uIG1vZGVsIChDRykgb3V0cHV0cyBhcmUgcGxvdHRlZCBmcm9tIE1heSB0byBEZWNlbWJlciwgdGhlIHBlcmlvZCBjb3JyZXNwb25kaW5nIHRvIGNlbGwgd2FsbCB0aGlja2VuaW5nIGZvciBhbGwgdHJlZeKAkHJpbmcgc3ViZGl2aXNpb25zLiBUaGUgeWVsbG93IGNvbG9yIGxpbmVzIGNvcnJlc3BvbmQgdG8gdGhlIENHIHNpbXVsYXRpb25zIG9mIM60MThPIGNlbGx1bG9zZSB3aXRoaW4gdGhlIHJhbmdlIG9mIHRoZSBwcm9wb3J0aW9uIG9mIGV4Y2hhbmdlYWJsZSBveHlnZW4gaW4gY2VsbHVsb3NlIChQZXgpIHZhcmlhYmlsaXR5IGZyb20gMC4xICh0aGluIGxpbmUpIHRvIDAuNyAodGhpY2sgbGluZSkuIFRoZSBncmF5IGhvcml6b250YWwgYmFycyBjb3JyZXNwb25kIHRvIHRoZSBjZWxsIHdhbGwgdGhpY2tlbmluZyAob3IgY2VsbOKAkG1hdHVyYXRpb24pIHBlcmlvZCBmb3IgZWFjaCBzdWJkaXZpc2lvbiBhbmQgYXJlIHBsb3R0ZWQgb24gdGhlIG1lYW4gb2YgdGhlIM60MThPIG1lYXN1cmVtZW50cy4gVGhlIGNlbGwgd2FsbCB0aGlja2VuaW5nIHBoYXNlIHdhcyBkZXJpdmVkIGZyb20gbWljcm9zY29waWMgcGhlbm9sb2dpY2FsIG9ic2VydmF0aW9ucyBmcm9tIE1vcmlubyBhbmQgSHVnaGVzIChVbml2ZXJzaXR5IG9mIEFyaXpvbmEsIHVucHVibGlzaGVkIG9ic2VydmF0aW9ucywgVGFibGUgUzMpLiBUaGUgY2xpbWF0ZSBkcml2ZXJzIHVzZWQgaW4gdGhlIENHIG1vZGVsIHRvIG1ha2UgzrQxOE9jZWwgcHJlZGljdGlvbnMgd2VyZSBkZXJpdmVkIGZyb20gUFJJU00gZGF0YTsgKGIpIHNlYXNvbmFsIGN5Y2xlIG9mIHRoZSBDRyBtZWFuIGxlYWYgd2F0ZXIgZW5yaWNobWVudCAozpRMKS4gVGhlIHNoYWRlZCBncmF5IGNvbG9yIGNvcnJlc3BvbmRzIHRvIHRoZSBzdGFuZGFyZCBkZXZpYXRpb24gb2YgbW9kZWxsZWQgzpRMLiBUaGUgZGFzaGVkIGJsdWUgbGluZSBpbiAoYSkgYW5kIChiKSBpbmRpY2F0ZXMgdGhlIGF2ZXJhZ2UgZGF0ZSBvZiB0aGUgbW9uc29vbiBvbnNldDsgKGMpIG1vZGVsbGVkIM6UTCBwbG90dGVkIHZlcnN1cyByZWxhdGl2ZSBodW1pZGl0eSAoUkgpIGluICUgY2FsY3VsYXRlZCBhdCBiaW1vbnRobHkgcmVzb2x1dGlvbi4gVGhlIM6UTCBzaW11bGF0aW9ucyB3ZXJlIHJ1biB1c2luZyBtZWFuLCBtaW5pbXVtLCBhbmQgbWF4aW11bSBSSC4gVGhlIHJhbmdlIG9mIFJIIGZvciB0aGUgaHlwZXLigJBhcmlkIHBlcmlvZCBvZiBNYXkgYW5kIEp1bmUgYXJlIHBsb3R0ZWQgaW4gb3JhbmdlIGNpcmNsZXMuIFRoZSBkYXJrIGJsdWUgY2lyY2xlcyByZXByZXNlbnQgUkggcmFuZ2Ugb2JzZXJ2ZWQgZm9yIHRoZSBtb25zb29uIHNlYXNvbiAoSnVseeKAk0F1Z3VzdCkuIFRoZSBncmF5IGNpcmNsZXMgY29ycmVzcG9uZCB0byB0aGUgcmFuZ2Ugb2YgUkggb2JzZXJ2ZWQgZnJvbSBTZXB0ZW1iZXIgdG8gQXByaWwgKEJlbG1lY2hlcmkgZXQgYWwuIDIwMTggUENFKV0oZmlndXJlcy9GSUdVUkU2LnBuZykKCnlvdXIgZXN0aW1hdGlvbnMgZm9yIHRoZSBjYWxsdWxvc2Ugb3h5Z2VuIElzb3RvcGVzIGFyZToKYGBge3J9CnJvdW5kKGNlbGx1bG9zZV9kMThPLCBkaWdpdHMgPSAyKQpgYGAKeW91ciBlc3RpbWF0aW9ucyBmb3IgdGhlIGxlYWYgd2F0ZXIgb3h5Z2VuIElzb3RvcGVzIGFyZToKYGBge3J9CnJvdW5kKGxlYWZfd2F0ZXJfMThPLCBkaWdpdHMgPSAyKQpgYGAKCiMjIyAgQ29tcGFyaXNvbiBiZXR3ZWVuIG1vZGVsZWQgZGF0YSBhbmQgb2JzZXJ2YXRpb25zLCAKTm93IHdpdGggdGhlc2UgdmFsdWVzIHRoYXQgeW91IGNvbWFyZWQgIHdyaXRlIGRvd24geW91ciBvYnNlcnZhdGlvbnMgZGlmZmVyZW5jZXMgYW5kICBzaW1pbGFyaXRpZXMgYmV0d2VlbiAgdGhlIG1vZGVsZWQgZGF0YSBpbiB0aGlzIGV4Y2Vyc2lzZSBhbmQgdGhlIG1lYXN1cmVtZW50cyBzaG93biBpbiB0aGUgZmlndXJlIDIgYWJvdmUuICAKCkhvdyBkbyB5b3UgdGhpbmsgdGhpcyB0b29sIGlzIHVzZWZ1bD8KCldoYXQgYXJlIHRoZSBjb25zdHJhaW5zIG9yIGRpZmZpY3VsdGllcyBvbiBpbXBsZWVudGluZyB0aGlzIG1vZGVsIGZvciByZWxpYWJsZSBhbmFseXNpcz8KCgpHb29kIGx1Y2shCgoKCgoKCgoKCgo=